Cross Module Optimization (CMO) (which is often implied by Interprocedural Optimization (IPO)) is one of the most effective ways to enable a compiler to optimize user programs. Traditionally, CMO is implemented using a technology called Link Time Optimization (LTO). LTO is a compilation model that enables cross-module optimizations and whole program analysis at link time (as the name suggests). However, LTO suffers from several limitations that make it unsuitable for use with very large applications. Such limitations include, for example: (1) LTO requires a huge amount of memory to perform the link step; (2) the link step is serial and greatly slows down the overall compilation; and (3) LTO cannot be easily integrated with large distributed build systems.
Other existing technology for implementing CMO is referred to as Lightweight IPO (LIPO), which is much more scalable than LTO. However, LIPO suffers from its own set of limitations and a ceiling has been reached in terms of it being possible to further improve LIPO's performance. Some examples of the issues associated with LIPO include: (1) LIPO requires profile feedback, and cannot be enabled by default; (2) LIPO is very intrusive to the build system (e.g., complex build system support is needed to deploy it); and (3) LIPO uses a coarse grain importing method that greatly limits the potential of CMO.